package generator.utils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.jdom.JDOMException;
import org.jdom.input.DOMBuilder;
import org.jdom.input.SAXBuilder;
import org.jdom.output.DOMOutputter;
import org.jdom.output.XMLOutputter;
import org.jdom.transform.JDOMSource;
import org.w3c.dom.Document;

/**Esta clase provee soporte de conversión de documentos Dom o JDom.Otra funcionalidad es la de
 * conversión de un documento a archivo fuente de java llevado a cabo mediante una hoja de estilo*/
public class  TransformDocs{
	
	/**Convierte un documento Dom a otro JDom
	 * @param doc
	 * 			documento tipo org.w3c.dom.Document que desea ser convertido a documento JDOM
	 * @return org.jdom.Document*/
	public static org.jdom.Document domToJDom (Document doc){
		DOMBuilder builder = new DOMBuilder();
		org.jdom.Document ret = builder.build(doc); 
		return ret;
	}
	
	/**Convierte un documento JDom a uno Dom
	 * @param doc
	 * 			documento tipo org.jdom.Document que desea ser convertido a documento DOM
	 * @return org.w3c.dom.Document*/
	public static org.w3c.dom.Document jDomToDom(org.jdom.Document doc) {
		try {
			DOMOutputter outputter = new DOMOutputter();
			return outputter.output(doc);
		} catch (JDOMException e) {
				e.printStackTrace();
				return null;
		}		
	}
	
	/**Provee soporte de conversión de un archivo xml a un documento JDom
	 * @param file
	 * 			indica la ruta del archivo xml que desea convertirse a documento JDom
	 * @return org.jdom.Document que representa el archivo xml*/
	public static org.jdom.Document xmlToJDom (File file) {
		try {
			SAXBuilder builder = new SAXBuilder(false);
			return builder.build(file);	
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
	}
	
	/**Provee soporte de conversión de un archivo xml a un documento Dom
	 * @param file
	 * 			indica la ruta del archivo xml que desea convertirse a documento Dom
	 * @return org.w3c.dom.Document que representa el archivo xml*/
	public static org.w3c.dom.Document xmlToDom(File file){
		org.jdom.Document jdomDoc = TransformDocs.xmlToJDom(file);
		return TransformDocs.jDomToDom(jdomDoc);
	}
	
	/**Crea un archivo de texto en la ruta especificada a partir de un documento
	 * @param doc
	 * 			documento que se desea transformar a archivo
	 * @param path
	 * 			indica el nombre que se le dará al archivo*/
	public static void flushDocument(org.w3c.dom.Document doc, String path){
		org.jdom.Document flusher = TransformDocs.domToJDom(doc);
		try {
			XMLOutputter out = new XMLOutputter();
			OutputStream file = new FileOutputStream(path);
			out.output(flusher,file);
			file.flush();
			file.close();
		} catch (Exception e) {
			System.out.println("Falló la operación de volcado del archivo: "+path);
			e.printStackTrace();
		}		
	}
	
	
	
	/**Realiza la conversión de un documento JDom a un archivo fuente de Java 
	 * @param document
	 * 				es el documento que desea transformarse a archivo fuente de java
	 * @param filePath
	 * 				es el nombre que recibirá el archivo java generado
	 * @throws TransformerFactoryConfigurationError 
	 * @throws FileNotFoundException 
	 * @throws TransformerException */
	public static void jDOMToJavaSource(org.jdom.Document document, String filePath, String XSLTSource) throws TransformerFactoryConfigurationError, FileNotFoundException, TransformerException {

		Transformer transformer = (TransformerFactory.newInstance()).newTransformer(new StreamSource(XSLTSource));		 
		JDOMSource source = new JDOMSource(document);
		StreamResult result = new StreamResult(new FileOutputStream(filePath));
		transformer.transform(source,result); 

	}
	
	/**Realiza la conversión de un documento Dom a un archivo fuente de Java 
	 * @param document
	 * 				es el documento que desea transformarse a archivo fuente de java
	 * @param filePath
	 * 				es el nombre que recibirá el archivo java generado
	 * @throws TransformerFactoryConfigurationError 
	 * @throws FileNotFoundException 
	 * @throws TransformerException */
	public static void domToJavaSource(org.w3c.dom.Document document, String filePath, String XSLTSource) throws TransformerFactoryConfigurationError, FileNotFoundException, TransformerException {
		TransformDocs.jDOMToJavaSource(TransformDocs.domToJDom(document), filePath, XSLTSource);
	}
	
	
}
